1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package com.sun.imageio.plugins.jpeg;
27
28 import javax.imageio.metadata.IIOMetadataFormatImpl;
29 import javax.imageio.ImageTypeSpecifier;
30 import javax.imageio.plugins.jpeg.JPEGQTable;
31 import javax.imageio.plugins.jpeg.JPEGHuffmanTable;
32
33 import java.awt.image.ColorModel;
34 import java.awt.image.BufferedImage;
35 import java.awt.image.DataBuffer;
36 import java.awt.color.ColorSpace;
37 import java.awt.color.ICC_ColorSpace;
38
39
40
41
42
43
44 public class JPEG {
45
46
47
48
49 public static final int TEM = 0x01;
50
51
52
53
54
55 public static final int SOF0 = 0xC0;
56
57 public static final int SOF1 = 0xC1;
58
59 public static final int SOF2 = 0xC2;
60
61 public static final int SOF3 = 0xC3;
62
63
64 public static final int DHT = 0xC4;
65
66
67
68 public static final int SOF5 = 0xC5;
69
70 public static final int SOF6 = 0xC6;
71
72 public static final int SOF7 = 0xC7;
73
74
75 public static final int JPG = 0xC8;
76
77
78
79 public static final int SOF9 = 0xC9;
80
81 public static final int SOF10 = 0xCA;
82
83 public static final int SOF11 = 0xCB;
84
85
86 public static final int DAC = 0xCC;
87
88
89
90 public static final int SOF13 = 0xCD;
91
92 public static final int SOF14 = 0xCE;
93
94 public static final int SOF15 = 0xCF;
95
96
97 public static final int RST0 = 0xD0;
98 public static final int RST1 = 0xD1;
99 public static final int RST2 = 0xD2;
100 public static final int RST3 = 0xD3;
101 public static final int RST4 = 0xD4;
102 public static final int RST5 = 0xD5;
103 public static final int RST6 = 0xD6;
104 public static final int RST7 = 0xD7;
105
106 public static final int RESTART_RANGE = 8;
107
108
109 public static final int SOI = 0xD8;
110
111 public static final int EOI = 0xD9;
112
113 public static final int SOS = 0xDA;
114
115
116 public static final int DQT = 0xDB;
117
118
119 public static final int DNL = 0xDC;
120
121
122 public static final int DRI = 0xDD;
123
124
125 public static final int DHP = 0xDE;
126
127
128 public static final int EXP = 0xDF;
129
130
131
132 public static final int APP0 = 0xE0;
133 public static final int APP1 = 0xE1;
134 public static final int APP2 = 0xE2;
135 public static final int APP3 = 0xE3;
136 public static final int APP4 = 0xE4;
137 public static final int APP5 = 0xE5;
138 public static final int APP6 = 0xE6;
139 public static final int APP7 = 0xE7;
140 public static final int APP8 = 0xE8;
141 public static final int APP9 = 0xE9;
142 public static final int APP10 = 0xEA;
143 public static final int APP11 = 0xEB;
144 public static final int APP12 = 0xEC;
145 public static final int APP13 = 0xED;
146
147 public static final int APP14 = 0xEE;
148 public static final int APP15 = 0xEF;
149
150
151
152
153 public static final int COM = 0xFE;
154
155
156
157 public static final int DENSITY_UNIT_ASPECT_RATIO = 0;
158
159 public static final int DENSITY_UNIT_DOTS_INCH = 1;
160
161 public static final int DENSITY_UNIT_DOTS_CM = 2;
162
163 public static final int NUM_DENSITY_UNIT = 3;
164
165
166 public static final int ADOBE_IMPOSSIBLE = -1;
167 public static final int ADOBE_UNKNOWN = 0;
168 public static final int ADOBE_YCC = 1;
169 public static final int ADOBE_YCCK = 2;
170
171
172 public static final String vendor = "Oracle Corporation";
173 public static final String version = "0.5";
174
175 public static final String [] names = {"JPEG", "jpeg", "JPG", "jpg"};
176 public static final String [] suffixes = {"jpg", "jpeg"};
177 public static final String [] MIMETypes = {"image/jpeg"};
178 public static final String nativeImageMetadataFormatName =
179 "javax_imageio_jpeg_image_1.0";
180 public static final String nativeImageMetadataFormatClassName =
181 "com.sun.imageio.plugins.jpeg.JPEGImageMetadataFormat";
182 public static final String nativeStreamMetadataFormatName =
183 "javax_imageio_jpeg_stream_1.0";
184 public static final String nativeStreamMetadataFormatClassName =
185 "com.sun.imageio.plugins.jpeg.JPEGStreamMetadataFormat";
186
187
188 public static final int JCS_UNKNOWN = 0;
189 public static final int JCS_GRAYSCALE = 1;
190 public static final int JCS_RGB = 2;
191 public static final int JCS_YCbCr = 3;
192 public static final int JCS_CMYK = 4;
193 public static final int JCS_YCC = 5;
194 public static final int JCS_RGBA = 6;
195 public static final int JCS_YCbCrA = 7;
196
197
198 public static final int JCS_YCCA = 10;
199 public static final int JCS_YCCK = 11;
200
201 public static final int NUM_JCS_CODES = JCS_YCCK+1;
202
203
204 public static final int [] [] bandOffsets = {{0},
205 {0, 1},
206 {0, 1, 2},
207 {0, 1, 2, 3}};
208
209 public static final int [] bOffsRGB = { 2, 1, 0 };
210
211
212
213
214
215 public static class JCS {
216 public static final ColorSpace sRGB =
217 ColorSpace.getInstance(ColorSpace.CS_sRGB);
218
219 private static ColorSpace YCC = null;
220 private static boolean yccInited = false;
221
222 public static ColorSpace getYCC() {
223 if (!yccInited) {
224 try {
225 YCC = ColorSpace.getInstance(ColorSpace.CS_PYCC);
226 } catch (IllegalArgumentException e) {
227
228 } finally {
229 yccInited = true;
230 }
231 }
232 return YCC;
233 }
234 }
235
236
237 public static final float DEFAULT_QUALITY = 0.75F;
238
239
240
241
242
243
244
245 static boolean isNonStandardICC(ColorSpace cs) {
246 boolean retval = false;
247 if ((cs instanceof ICC_ColorSpace)
248 && (!cs.isCS_sRGB())
249 && (!cs.equals(ColorSpace.getInstance(ColorSpace.CS_CIEXYZ)))
250 && (!cs.equals(ColorSpace.getInstance(ColorSpace.CS_GRAY)))
251 && (!cs.equals(ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB)))
252 && (!cs.equals(ColorSpace.getInstance(ColorSpace.CS_PYCC)))
253 ) {
254 retval = true;
255 }
256 return retval;
257 }
258
259
260
261
262
263
264
265 static boolean isJFIFcompliant(ImageTypeSpecifier imageType,
266 boolean input) {
267 ColorModel cm = imageType.getColorModel();
268
269 if (cm.hasAlpha()) {
270 return false;
271 }
272
273 int numComponents = imageType.getNumComponents();
274 if (numComponents == 1) {
275 return true;
276 }
277
278
279 if (numComponents != 3) {
280 return false;
281 }
282
283 if (input) {
284
285 if (cm.getColorSpace().getType() == ColorSpace.TYPE_RGB) {
286 return true;
287 }
288 } else {
289
290 if (cm.getColorSpace().getType() == ColorSpace.TYPE_YCbCr) {
291 return true;
292 }
293 }
294
295 return false;
296 }
297
298
299
300
301
302
303
304 static int transformForType(ImageTypeSpecifier imageType, boolean input) {
305 int retval = ADOBE_IMPOSSIBLE;
306 ColorModel cm = imageType.getColorModel();
307 switch (cm.getColorSpace().getType()) {
308 case ColorSpace.TYPE_GRAY:
309 retval = ADOBE_UNKNOWN;
310 break;
311 case ColorSpace.TYPE_RGB:
312 retval = input ? ADOBE_YCC : ADOBE_UNKNOWN;
313 break;
314 case ColorSpace.TYPE_YCbCr:
315 retval = ADOBE_YCC;
316 break;
317 case ColorSpace.TYPE_CMYK:
318 retval = input ? ADOBE_YCCK : ADOBE_IMPOSSIBLE;
319 }
320 return retval;
321 }
322
323
324
325
326
327 static float convertToLinearQuality(float quality) {
328
329 if (quality <= 0.0F) {
330 quality = 0.01F;
331 }
332
333 if (quality > 1.00F) {
334 quality = 1.00F;
335 }
336
337 if (quality < 0.5F) {
338 quality = 0.5F / quality;
339 } else {
340 quality = 2.0F - (quality * 2.0F);
341 }
342
343 return quality;
344 }
345
346
347
348
349 static JPEGQTable [] getDefaultQTables() {
350 JPEGQTable [] qTables = new JPEGQTable[2];
351 qTables[0] = JPEGQTable.K1Div2Luminance;
352 qTables[1] = JPEGQTable.K2Div2Chrominance;
353 return qTables;
354 }
355
356
357
358
359 static JPEGHuffmanTable [] getDefaultHuffmanTables(boolean wantDC) {
360 JPEGHuffmanTable [] tables = new JPEGHuffmanTable[2];
361 if (wantDC) {
362 tables[0] = JPEGHuffmanTable.StdDCLuminance;
363 tables[1] = JPEGHuffmanTable.StdDCChrominance;
364 } else {
365 tables[0] = JPEGHuffmanTable.StdACLuminance;
366 tables[1] = JPEGHuffmanTable.StdACChrominance;
367 }
368 return tables;
369 }
370
371 }